查看原文
其他

Python批量查询ip定位并绘制城市分布图

道才 可以叫我才哥 2021-10-08

点击蓝字关注我们



目录

  • ip地址定位查询接口介绍

  • 批量查询45万个ip地址定位

  • 利用pyecharts绘制城市分布图

ip地址定位查询接口介绍

查询了很多资料,找到了一些ip地址定位查询的接口,基本都是免费的其中像高德地图、腾讯地图以及百度地图等都提供API接口,只需要注册他们的个人开发者账号即可调用。因为我这边一共有45万个ip地址需要进行查询(在去重后也有40万+个),对比了这三家地图的api接口后发现 高德支持一天30万次请求,腾讯地图只支持1万次请求每天,百度地图就更少了低于1万次。所以,我又找到了一家完全免费且不限请求次数的api接口,太平洋网络IP地址查询web接口(地址:http://whois.pconline.com.cn/)太平洋网络IP地址查询接口示例: 1import requests
2import json
3
4url = 'http://whois.pconline.com.cn/ipJson.jsp'
5ip = '61.235.82.163'
6param = {'ip':ip,
7         'json':'true'
8        } 
9ree = requests.get(url, params = param)    
10re = json.loads(ree.text.replace("\\"," "))
11print(re)
输出结果如下: 1{'ip''61.235.82.163',
2 'pro''广东省',
3 'proCode''440000',
4 'city''广州市',
5 'cityCode''440100',
6 'region''天河区',
7 'regionCode''440106',
8 'addr''广东省广州市天河区 蓝色心情网吧',
9 'regionNames''',
10 'err'''}
另外,高德地图API接口调用方式如下: 1import requests
2import json
3
4url = 'https://restapi.amap.com/v3/ip?parameters'
5ip = '61.235.82.163'
6param = {'key':'你的key值',
7        'ip':ip,
8        'output':'JSON'
9        } 
10ree = requests.get(url, params = param)    
11re = json.loads(ree.text.replace("\\"," "))
12print(re)
高德地图API接口还返回了该ip地址所在城市矩形区域范围1{'status''1',
2 'info''OK',
3 'infocode''10000',
4 'province''广东省',
5 'city''广州市',
6 'adcode''440100',
7 'rectangle''113.1017375,22.93212254;113.6770499,23.3809537'}

批量查询45万个ip地址定位

我试了一下,循环查询45万个ip地址定位,30分钟才跑完3万个左右。如果需要跑完全部,估计在8小时左右,简直太久了。然后一个朋友和我说,可以试试多线程或多进程。好熟悉的名词,但是我木有用过。。于是,找来官方资料看了下,原来如此啊。于是,我便去尝试了下。果然,4核8 cpu都爆满了,最终45万个ip地址定位结果只用了1小时40余分钟。静默状态下cpu使用情况

多进程下cpu使用情况


我们将ip地址数据拆分为6万每份共8份,然后循环每份数据进行ip地址定位查询

1def Get_data(num,data):#获取ip地址定位
2    li = []
3
4    datax = data.iloc[(num-1)*60000:60000*num] #因为一共45万左右数据,按照6万每份进行分割
5    n = len(datax.index)
6
7    for _i in range(n):
8        ip = datax['ip'].iloc[_i]
9        param = {'ip':ip,
10                 'json':'true'
11            } 
12        try:
13            ree = requests.get(url, params = param)    
14            re = json.loads(ree.text.replace("\\"," "))
15            logging.info(f"已经存储{_i+1}个ip及所在地")    
16            li.append(re)
17        except json.decoder.JSONDecodeError:
18            logging.info(" param['ip']")
19            continue
20    return li
因为机器是4核8 cpu,这是为啥选择了8份的原因,然后调用进程池…多进程的标准库
import multiprocessing 1def main(page,data):#数据导出
2    logging.info('正在获取数据')
3    Li = Get_data(page,data)
4    logging.info('正在导出数据')
5    df = pd.DataFrame(Li)
6    e = r'E:\python\数据处理'
7    path = f'{e}\{page}.xlsx'
8    df.to_excel(path)
9    logging.info('数据计算完成!')
10
11if __name__ ==  '__main__':
12    logging.info('正在读取原始数据')
13    data = pd.read_excel(r'E:\python\数据处理\每日新增用户.xlsx')
14    logging.info('原始数据读取完成')
15    pool = multiprocessing.Pool()
16    pages = range(1,9)
17    pool.map(partial(main,data=data),pages)
18    pool.close()
19    pool.join()
用multiprocess中的Pool起进程池,进程池中开启的个数:默认是cpu个数map:可以拿到返回值的可迭代对象,循环就可以获取返回值了这里除了map也用到了partial方法,因为main()需要传递2个参数,所以先用functools.partial将固定的参数值和main()进行绑定,然后再用map进行循环传参数page同时有多个任务在执行:

利用pyecharts绘制城市分布图

采用pyecharts的map方法,传入城市及城市对应的数值,即可完成绘制 1import pandas as pd
2from pyecharts import options as opts
3from pyecharts.charts import Map
4
5df = df[['pro','city','ip']]
6df = df.dropna()
7data = pd.pivot_table(df,values='ip',index='city',aggfunc='count').reset_index()
8data['city']=data['city'].apply(lambda x:x.replace("省",'').replace("市",''))
9
10
11c = (
12    Map()
13    .add("注册玩家分布", [list(z) for z in zip(data['city'], data['ip'])], "china-cities",label_opts=opts.LabelOpts(is_show=False))
14    .set_global_opts(
15        title_opts=opts.TitleOpts(title="玩家分布"),
16        visualmap_opts=opts.VisualMapOpts(max_=5000),
17    )
18)
19c.width = '1200px'
20c.height = '900px'
21c.render('玩家城市分布.html')
城市分布图



扫描二维码

关注我们

微信号 :AlphaGame



: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存